<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 递归函数（递归循环）：函数自身调用自身


    //     function fn3(num){
    //         return num * 1; 
    //     }


    //     function fn2(num){
    //         return num * fn3(num-1);
    //     }



    //     function fn1(num){
    //         return num * fn2(num-1);   
    //     }

    //     /* 
    //         fn1(3)---->  3* fn2(2)  
    //                     3 * 2* fn3(1)
    //                     3 * 2 *  1  = 6

        
        
    //     */

    //   var res =   fn1(3);
    //   console.log(res);  // 结果 ？3! = 3*2*1  = 6;



    // 通过递归 来计算 阶乘；

        // function fn(num){
        //     console.log(num);
        //     if(num==1){
        //         return num*1;  //返还结果  且 阻止程序执行；
        //     }
        //     return num * fn(num-1);
        // }

        // var res = fn(3);
        // console.log(res);



        // 死递归 ，死循环 ；
        // 递归的时候，一定要给一个出口 ：给一个停止递归循环的条件；
        // 1.可读性不强； 2.性能不好；
        var a = 0;
        function myfn(){
            console.log(a);
            a++;
            if(a<5){ // 条件
                myfn();
            }
        }

        // myfn();

    // 斐波那契数列 
    // 1 1 2 3 5 8 13 21....
    // 1 2 3 4 5 6  7  8
    // fn(1) === 1  fn(2) ===1

    // fn(3) ---> fn(2) + fn(1)
    // 规定一个函数 的 fn(1) 和fn(2)的结果是1
    function fn(num){
        if(num==1 || num==2){
            return 1;
        }
        return fn(num-1) + fn(num-2);
    }

   var res =   fn(5);
   console.log(res);

   /* 
    fn(4)----> fn(3) + fn(2)
               fn(2) + fn(1) + fn(2) 
   
   fn(5)---> fn(4) + fn(3)
            fn(3) + fn(2) +  fn(2) + fn(1)
            fn(2) + fn(1) + fn(2) +  fn(2) + fn(1)
   
   */

//    函数式编程 纯函数编程  无值编程 科里化  高阶函数....


    </script>
</body>
</html>